//
//  XPGDataXML_Demo.swift
//  PPKit
//
//  Created by xiaopin on 2020/6/3.
//  Copyright © 2020 scoresdata.net. All rights reserved.
//

/*
 解析 XML 通常有两种方式，DOM 和 SAX：

 DOM解析XML时，读入整个XML文档并构建一个驻留内存的树结构（节点树），通过遍历树结构可以检索任意XML节点，读取它的属性和值。而且通常情况下，可以借助XPath，直接查询XML节点。

 SAX解析XML，是基于事件通知的模式，一边读取XML文档一边处理，不必等整个文档加载完之后才采取操作，当在读取解析过程中遇到需要处理的对象，会发出通知对其进行处理。

 一般在iOS平台下，比较常用的XML解析类库有如下几种：

 NSXMLParser，http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html ，这是一个SAX方式解析XML的类库，默认包含在iOS SDK中，使用也比较简单。

 libxml2，http://xmlsoft.org/，是一套默认包含在iOS SDK中的开源类库，它是基于C语言的API，所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析，libxml2的SAX解析方式还是非常酷的，因为它可以边读取边解析，尤其是在从网上下载一个很大的XML文件，就可以一边下载一边对已经下载好的内容进行解析，极大的提高解析效率。

 TBXML，http://www.tbxml.co.uk/TBXML/TBXML_Free.html，这是一套轻量级的DOM方式的XML解析类库，有很好的性能和低内存占用，不过它不对XML格式进行校验，不支持XPath，并且只支持解析，不支持对XML进行修改。

 TouchXML，https://github.com/TouchCode/TouchXML，这也是一套DOM方式的XML解析类库，支持XPath，不支持XML的修改。

 KissXML，http://code.google.com/p/kissxml/，这是一套基于TouchXML的XML解析类库，和TouchXML相比，支持了XML的修改。

 TinyXML，http://www.grinninglizard.com/tinyxml/，这是一套小巧的基于C语言的DOM方式进行XML解析的类库，支持对XML的读取和修改，不直接支持XPath，需要借助另一个相关的类库TinyXPath才可以支持XPath。

 GDataXML，http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/，这是一套Google开发的DOM方式XML解析类库，支持读取和修改XML文档，支持XPath方式查询。
 
 
 一、GDataXMLNode说明
  
 GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2--DOM处理方式进行了封装，能对较小或中等的xml文档进行读写操作且支持XPath语法。
  
 使用方法：
      1、获取GDataXMLNode.h/m文件，将GDataXMLNode.h/m文件添加到工程中
      2、向工程中增加“libxml2.dylib”库
      3、在工程的“Build Settings”页中找到“Header Search Path”项，添加/usr/include/libxml2"到路径中
      4、添加“GDataXMLNode.h”文件到头文件中，如工程能编译通过，则说明GDataXMLNode添加成功
 
 //DOM 解析

 - (IBAction)dommethord:(id)sender {

  

     //1,拿到文件

     NSString *path = [[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];

     //2,根据路径拿到数据

     NSData *data = [NSData dataWithContentsOfFile:path];

     

     //3,创建解析对象

     GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

  

     //4,获取根

     GDataXMLElement *rootElement = document.rootElement;

  

     //初始化数组

     _allDataMutaArray = [NSMutableArray array];

     _allDataMutaString = [NSMutableString string];

     

     //5,获取根节点下的 所有子节点

     NSArray *stuArrayElement = rootElement.children;

     

     //6，遍历每一个Student

     for (GDataXMLElement *stuElement in stuArrayElement) {

         //每遍历一次就 创建一个模型

         Student *stu = [Student new];

         //7，遍历子节点

         for (GDataXMLElement *stuSubElement in stuElement.children) {

             //8，使用KVC的方式 对模型对象进行复制

             [stu setValue:stuSubElement.stringValue forKey:stuSubElement.name];

             //打印

             NSLog(@"%@ %@ ",stuSubElement.name,stuSubElement.stringValue);

             [_allDataMutaString appendString:stuSubElement.stringValue];

         }

         //将添加好的模型放入数组中

         [_allDataMutaArray addObject:stu];

         [stu release];

        

         NSLog(@"----%lu",stu.retainCount);

        

     }

     NSLog(@" 数据项  %@",_allDataMutaArray);

     

     _textFieldView.text = _allDataMutaString;

     

     [document release];

 }
 
 **/
